/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var result = 0

func minCameraCover(root *TreeNode) int {
    result = 0
    if traversal(root) == 0 {
        result++
    }
    return result
}

func traversal(node *TreeNode) int {
    /*
        0 无覆盖
        1 有摄像头
        2 有覆盖
    */
    if node == nil { // 空节点默认覆盖，因为如果不覆盖的话，叶子节点就放摄像头了，导致浪费。
        return 2
    }
    left := traversal(node.Left)
    right := traversal(node.Right)
    if left == 2 && right == 2 { // 自由左右节点都为有覆盖的时候，自身节点没有覆盖。
        return 0
    } else {
        if left == 0 || right == 0 { // 只要有一个节点没有覆盖，自身节点需要防止摄像头
            result++
            return 1
        } else {
            return 2
        }
    }
}